entry: postpone magnifier creation until when needed
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 10 Mar 2014 20:54:31 +0000 (21:54 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 10 Mar 2014 22:07:21 +0000 (23:07 +0100)
gtk/gtkentry.c

index 95e27800a9d5e7e71e9298b724b98cf2c45c0c64..68a976b323748afd433f2a6c48ff75b7098a10ca 100644 (file)
@@ -2695,6 +2695,15 @@ gtk_entry_init (GtkEntry *entry)
                     G_CALLBACK (gtk_entry_handle_dragged), entry);
   g_signal_connect (priv->text_handle, "drag-finished",
                     G_CALLBACK (gtk_entry_handle_drag_finished), entry);
+}
+
+static void
+gtk_entry_ensure_magnifier (GtkEntry *entry)
+{
+  GtkEntryPrivate *priv = entry->priv;
+
+  if (priv->magnifier_popover)
+    return;
 
   priv->magnifier = _gtk_magnifier_new (GTK_WIDGET (entry));
   gtk_widget_set_size_request (priv->magnifier, 100, 60);
@@ -2946,7 +2955,9 @@ gtk_entry_finalize (GObject *object)
   if (priv->selection_bubble)
     gtk_widget_destroy (priv->selection_bubble);
 
-  gtk_widget_destroy (priv->magnifier_popover);
+  if (priv->magnifier_popover)
+    gtk_widget_destroy (priv->magnifier_popover);
+
   g_object_unref (priv->text_handle);
   g_free (priv->placeholder_text);
   g_free (priv->im_module);
@@ -4465,7 +4476,8 @@ gtk_entry_button_release (GtkWidget      *widget,
   else if (is_touchscreen)
     {
       gtk_entry_selection_bubble_popup_set (entry);
-      gtk_widget_hide (priv->magnifier_popover);
+      if (priv->magnifier_popover)
+        gtk_widget_hide (priv->magnifier_popover);
     }
 
   priv->button = 0;
@@ -4498,6 +4510,8 @@ gtk_entry_show_magnifier (GtkEntry *entry,
   cairo_rectangle_int_t rect;
   GtkEntryPrivate *priv;
 
+  gtk_entry_ensure_magnifier (entry);
+
   gtk_widget_get_allocation (GTK_WIDGET (entry), &allocation);
   get_icon_allocations (entry, &primary, &secondary);
 
@@ -6574,7 +6588,9 @@ gtk_entry_handle_drag_finished (GtkTextHandle         *handle,
                                 GtkEntry              *entry)
 {
   gtk_entry_selection_bubble_popup_set (entry);
-  gtk_widget_hide (entry->priv->magnifier_popover);
+
+  if (entry->priv->magnifier_popover)
+    gtk_widget_hide (entry->priv->magnifier_popover);
 }